package cn.com.cdb.ldms.filter.sensitive;

import com.google.common.collect.ImmutableMap;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SensitiveDataUtils {
    // 默认脱敏规则（可动态扩展）
    public static final Map<String, String> DEFAULT_RULES = ImmutableMap.of(
            // 手机号（保留前3后4位）
            "PHONE", "(\\d{3})\\d{4}(\\d{4})",
            // 身份证（保留前4后4位）
            "ID_CARD", "(\\d{4})\\d{10}([0-9Xx]{4})",
            // 用户名（保留前1位）
            "USERNAME_KEEP1", "(?<=.{1}).*",
            // 邮箱保留前3位和域名
            "EMAIL", "(\\w{3}).*(@.*)",
            // 完全脱敏
            "MASK_ALL", ".*"
    );

    private SensitiveDataUtils() {
    }

    /**
     * 通用脱敏方法
     *
     * @param text        原始文本
     * @param customRules 自定义规则（可选，覆盖默认规则）
     * @return 脱敏后的文本
     */
    public static String desensitize(String text, Map<String, String> customRules) {
        if (text == null || text.isEmpty()) {
            return text;
        }

        // 合并规则（自定义优先）
        Map<String, String> rules = new HashMap<>(DEFAULT_RULES);
        if (customRules != null) {
            rules.putAll(customRules);
        }

        // 处理所有规则
        for (Map.Entry<String, String> entry : rules.entrySet()) {
            String field = entry.getKey();
            String rule = entry.getValue();

            // 正则匹配字段（如 "password":"xxx" 或 password=xxx）
            Pattern fieldPattern = Pattern.compile("(?i)(\"?" + field + "\"?[:=]\"?)(.*?)(\"?[,}\\s])", Pattern.DOTALL);
            Matcher matcher = fieldPattern.matcher(text);
            StringBuffer result = new StringBuffer();

            while (matcher.find()) {
                String originalValue = matcher.group(2);
                String maskedValue = applyRule(originalValue, rule);
                matcher.appendReplacement(result, matcher.group(1) + maskedValue + matcher.group(3));
            }
            matcher.appendTail(result);
            text = result.toString();
        }
        return text;
    }

    // 应用单条脱敏规则
    private static String applyRule(String value, String rule) {
        // 处理别名规则（同之前实现）
        if (rule.startsWith("@")) {
            String alias = rule.substring(1);
            String regex = DEFAULT_RULES.get(alias);
            if (regex == null) return value;
            rule = regex;
        }

        if (".*".equals(rule)) return "******";
        return value.replaceAll(rule, "$1****$2");
    }
}